home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / Family.cpp < prev    next >
C/C++ Source or Header  |  1998-03-15  |  2KB  |  154 lines

  1. #include <stdio.h>
  2. #include "Family.h"
  3.  
  4. Family::Family()
  5. {
  6.     Succ = NULL;
  7.     Head = (struct Family*)&Tail;
  8.     Tail = NULL;
  9.     TailPred = (struct Family*)&Head;
  10. }
  11.  
  12. void Family::Remove( void )
  13. {
  14.     if( Succ ) {
  15.         Succ->Pred = Pred;
  16.         Pred->Succ = Succ;
  17.         Succ = NULL;
  18.     }
  19. }
  20.  
  21. void Family::Swap( Family *f )
  22. {
  23.     Family *p1, *p2;
  24.  
  25.     if( Succ == f ) {
  26.  
  27.         f->Remove();
  28.         Pred->AddAfter( f );
  29.  
  30.     } else 
  31.     if( Pred == f ) {
  32.  
  33.         f->Remove();
  34.         AddAfter( f );
  35.  
  36.     } else {
  37.  
  38.         p1 = Pred;
  39.         p2 = f->Pred;
  40.  
  41.         Remove();
  42.         f->Remove();
  43.  
  44.         p1->AddAfter( f );
  45.         p2->AddAfter( this );
  46.  
  47.     }
  48. /*
  49.     Pred->Succ = f;
  50.     Succ->Pred = f;
  51.  
  52.     f->Succ->Pred = this;
  53.     f->Pred->Succ = this;
  54.  
  55.     b = Pred;
  56.     Pred = f->Pred;
  57.     f->Pred = b;
  58.  
  59.     b = Succ;
  60.     Succ = f->Succ;
  61.     f->Succ = b;
  62. */
  63.  
  64. }
  65.  
  66. short Family::Count( void )
  67. {
  68.     short n = 0;
  69.  
  70.     FScan( Family, f, this ) n++;
  71.  
  72.     return n;
  73.  
  74. }
  75.  
  76. Family::~Family()
  77. {
  78.     Remove();
  79.     KillChildren();
  80. }
  81.  
  82. void Family::KillChildren( void )
  83. {
  84.     if( !isEmpty() ) {
  85.         Family *item, *nitem;
  86.         for( item = Head; item->Succ; ) {
  87.             nitem = item->Succ;
  88.             delete item;
  89.             item = nitem;
  90.         }
  91.     }
  92. }
  93.  
  94. int Family::isEmpty( void )
  95. {
  96.     return( TailPred == (Family*)&Head );
  97. }
  98.  
  99. void Family::AddTail( struct Family *child )
  100. {
  101.     child->Succ = (struct Family*)&Tail;
  102.     child->Pred = TailPred;
  103.     TailPred->Succ = child;
  104.     TailPred = child;
  105. }
  106.  
  107. void Family::AddHead( struct Family *child )
  108. {
  109.     child->Succ = Head;
  110.     child->Pred = (struct Family*)&Head;
  111.     Head->Pred = child;
  112.     Head = child;
  113. }
  114.  
  115. void Family::AddAfter( Family *child )
  116. {
  117.     child->Succ = Succ;
  118.     child->Pred = this;
  119.     Succ->Pred = child;
  120.     Succ = child;
  121. }
  122.  
  123. Family *Family::Last( void )
  124. {
  125.         return TailPred;
  126. }
  127.  
  128. Family *Family::Parent( void )
  129. {
  130.     if( !Succ ) return 0;
  131.  
  132.     Family *s;
  133.     for( s = this; s->Succ; s = s->Succ );
  134.  
  135.     return (Family*)(((Family**)s)-3);
  136.  
  137. }
  138.  
  139. void Family::Disconnect( void )
  140. {
  141.     Succ = Pred = Head = Tail = TailPred = 0;
  142. }
  143.  
  144. void Family::Adopt( Family *f )
  145. {
  146.     Family *s, *n;
  147.  
  148.     for( s = f->Head; s->Succ; s = n ) {
  149.         n = s->Succ;
  150.         s->Remove();
  151.         AddTail( s );
  152.     }
  153. }
  154.